08 Docker 基础 - 本地目录挂载
数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。
本地目录挂载命令
bash
# 挂载目录
docker run -it -v /宿主机目录:/容器目录 镜像名
# 挂载文件
docker run -it -v /宿主机文件:/容器文件 镜像名注意
- 本地目录或文件必须以
/或./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。 - 如果本地目录不存在,会自动创建。
bash
docker run -it -v mysql:/var/lib/mysql mysql # 挂载数据卷,会被识别为一个数据卷叫 mysql
docker run -it -v ./mysql:/var/lib/mysql mysql # 挂载本地目录,运行时如果不存在会创建目录案例 mysql 容器的数据挂载
需求
- 查看 mysql 容器,判断是否有数据卷挂载
- 基于宿主机目录实现 MySQL 数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
- 挂载
/root/mysql/data到容器内的/var/lib/mysql目录 - 挂载
/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的 SQL 脚本目录) - 挂载
/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是 MySQL 配置文件目录)
- 挂载
提示
- 在执行
docker run命令时,使用-v 本地目录:容器内目录可以完成本地目录挂载 - 本地目录必须以 "/" 或 "./" 开头,如果直接以名称开头,会被识别为数据卷而非本地目录
-v mysql:/var/lib/mysql会被识别为一个数据卷叫 mysql-v ./mysql:/var/lib/mysql会被识别为当前目录下的 mysql 目录
所需文件
初始化 SQL 脚本和配置文件在课程资料中。目录:资料 → mysql → conf/init。
hm.cnf主要是配置了 MySQL 的默认编码,改为utf8mb4;hmall.sql则是后面我们要用到的黑马商城项目的初始化 SQL 脚本。
bash
❯ tree
.
├── conf
│ └── hm.cnf
└── init
└── hmall.sql
2 directories, 2 files删除原来的 MySQL 容器。
bash❯ dkrm -f mysql # docker rm -f mysql mysql创建并运行新 mysql 容器,挂载本地目录。
bash❯ pwd /home/ubuntu ❯ ls mysql/ VSCodeWorking/ hello-world.tar ❯ docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ -v ./mysql/data:/var/lib/mysql \ -v ./mysql/conf:/etc/mysql/conf.d \ -v ./mysql/init:/docker-entrypoint-initdb.d \ mysql df03411d0466e307368f25c94eb93ff802379d8f920900194822f58fe97c5477 ❯ dkps # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES df03411d0466 mysql "docker-entrypoint.s…" 33 seconds ago Up 32 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql a415c4c37209 nginx "/docker-entrypoint.…" 14 hours ago Up 12 hours 0.0.0.0:80->80/tcp, :::80->80/tcp查看 mysql 目录,可以发现 mysql/data 目录已经自动创建好了
bash❯ lsa mysql Permissions Size User Date Modified Name drwxrwxr-x - ubuntu 5 Nov 22:57 conf drwxr-xr-x - lxd 5 Nov 23:04 data drwxrwxr-x - ubuntu 5 Nov 22:57 init查看 data 目录,会发现里面有大量数据库数据,说明数据库完成了初始化。
bash❯ tree mysql -L 2 mysql ├── conf │ └── hm.cnf ├── data │ ├── auto.cnf │ ├── binlog.000001 │ ├── binlog.000002 │ ├── binlog.index │ ├── ca-key.pem │ ├── ca.pem │ ├── client-cert.pem │ ├── client-key.pem │ ├── hmall │ ├── #ib_16384_0.dblwr │ ├── #ib_16384_1.dblwr │ ├── ib_buffer_pool │ ├── ibdata1 │ ├── ibtmp1 │ ├── #innodb_redo │ ├── #innodb_temp │ ├── mysql │ ├── mysql.ibd │ ├── mysql.sock -> /var/run/mysqld/mysqld.sock │ ├── performance_schema │ ├── private_key.pem │ ├── public_key.pem │ ├── server-cert.pem │ ├── server-key.pem │ ├── sys │ ├── undo_001 │ └── undo_002 └── init └── hmall.sql 9 directories, 23 files进入 MySQL 容器,查看 MySQL 编码表。
bash❯ dex mysql mysql -uroot -p123 # docker exec -it mysql mysql -uroot -p123 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.2.0 MySQL Community Server - GPL Copyright (c) 2000, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show variables like "%char%"; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.2/charsets/ | +--------------------------+--------------------------------+ 8 rows in set (0.03 sec)发现编码是
utf8mb4没有问题。查看数据库。
bashmysql> show databases; +--------------------+ | Database | +--------------------+ | hmall | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)切换到 hmall 数据库,查看表。
bashmysql> use hmall; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------+ | Tables_in_hmall | +-----------------+ | address | | cart | | item | | order | | order_detail | | order_logistics | | pay_order | | user | +-----------------+ 8 rows in set (0.00 sec)查看 address 表数据。
bashmysql> select * from address; +----+---------+----------+--------+--------------+-------------+--------------------+-----------+------------+-------+ | id | user_id | province | city | town | mobile | street | contact | is_default | notes | +----+---------+----------+--------+--------------+-------------+--------------------+-----------+------------+-------+ | 59 | 1 | 北京 | 北京 | 朝阳区 | 13900112222 | 金燕龙办公楼 | 李嘉诚 | 0 | NULL | | 60 | 1 | 北京 | 北京 | 朝阳区 | 13700221122 | 修正大厦 | 李佳红 | 0 | NULL | | 61 | 1 | 上海 | 上海 | 浦东新区 | 13301212233 | 航头镇航头路 | 李佳星 | 1 | NULL | | 63 | 1 | 广东 | 佛山 | 永春 | 13301212233 | 永春武馆 | 李小龙 | 0 | NULL | +----+---------+----------+--------+--------------+-------------+--------------------+-----------+------------+-------+ 4 rows in set (0.00 sec)
总结
- 什么是数据卷?
- 数据卷是一个虚拟目录,它将宿主机目录映射到容器内目录,方便我们操作容器内文件,或者方便迁移容器产生的数据
- 如何挂载数据卷?
- 在创建容器时,利用
-v 数据卷名:容器内目录完成挂载 - 容器创建时,如果发现挂载的数据卷不存在时,会自动创建
- 在创建容器时,利用
- 数据卷的常见命令有哪些?
docker volume ls: 查看数据卷docker volume rm: 删除数据卷docker volume inspect: 查看数据卷详情docker volume prune: 删除未使用的数据卷